Spark Task 的执行流程① - 分配 tasks 给 executors

本文为 Spark 2.0 版本的源码分析,其他版本可能会有所不同

TaskScheduler 作为资源调度器的一个重要职责就在:

  • 集群可用资源发生变化(比如有新增的 executor,有 executor lost 等)
  • 有新的 task 提交
  • 有 task 结束
  • 处理 Speculatable task

等时机把处于等待状态的 tasks 分配给有空闲资源的 executors,那么这个 “把 task 分配给 executor” 的过程具体是怎样的呢?这就是本文要探讨的内容,将通过以下四小节来进行剖析:

  1. 打散可用的 executors
  2. 对所有处于等待状态的 taskSet 进行排序
  3. 根据是否有新增的 executor 来决定是否更新各个 taskSet 的可用本地性集合
  4. 结合 taskSets 的排序及本地性集合将 tasks 分配给 executors

打散可用的 executors

“把 task 分配给 executor” 这一过程是在函数 TaskSchedulerImpl#resourceOffers(offers: Seq[WorkerOffer]): Seq[Seq[TaskDescription]] 中完成的:

  • 传入参数 offers: Seq[WorkerOffer] 为集群中所有 activeExecutors 一一对应,一个 WorkerOffer 包含的信息包括:executorId、executorHost及该 executor 空闲的 cores
  • 返回值类型为 Seq[Seq[TaskDescription]],其每一个元素(即Seq[TaskDescription]类型)为经过该函数的调度分配给下标相同的 offers 元素对应的 executor 的 tasks

TaskSchedulerImpl#resourceOffers 第一阶段做的事可用下图表示:

在该函数每次被调用之时,通过随机的方式打乱所有 workerOffers(一个 workerOffer 对应一个active executor),之后会根据这打乱后的顺序给 executor 分配 task,这样做就能避免只将 tasks 分配给少数几个 executors 从而达到使集群各节点压力平均的目的。

除了打散 workerOffers,还为每个 workerOffer 创建了一个可变的 TaskDescription 数组从而组成了一个二维数组 tasks,用于保存之后的操作中分配给各个 executor 的 tasks。

对所有处于等待状态的 taskSet 进行排序

排序的目的是为了让优先级更高的 taskSet 所包含的 task 更优先的被调度执行,所执行的操作是:

val sortedTaskSets: ArrayBuffer[TaskSetManager] = rootPool.getSortedTaskSetQueue

其中,sortedTaskSets 是排序后得到的 TaskSetManager 数组,下标越小表示优先级越高,也就越优先被调度。而 rootPoolPool 类型,它是 Standalone 模式下的对列,支持两种调度模式,分别是:

  • SchedulingMode.FIFO:FIFO 模式,先进先出
  • SchedulingMode.FAIR:公平模式,会考虑各个对列资源的使用情况

更具体的分析,请移步Pool-Standalone模式下的队列,这篇文章对两种调度方式以及如何排序做做了十分详细的说明

根据是否有新增的 executor 来决定是否更新各个 taskSet 的可用本地性集合

关于更新 taskSet 的可用本地性集合,这里值进行简单说明,更多内容请移步 Spark的位置优先: TaskSetManager 的有效 Locality Levels

  • 若 taskSet 中有 task 的 partition 是存储在 executor 内存中的且对应 executor alive,那么该 taskSet 的最佳本地性为 PROCESS_LOCAL,可用本地性集合包括 PROCESS_LOCAL 及所有本地性比 PROCESS_LOCAL 查的,也就是该集合包括 PROCESS_LOCAL, NODE_LOCAL, NO_PREF, RACK_LOCAL, ANY
  • 若 taskSet 中没有 task 的 partition 是存储在 executor 内存中的,但存在 partition 是存储在某个节点磁盘上的且对应节点 alive ,那么该 taskSet 的最佳本地性为 NODE_LOCAL,可用本地性集合包括 NODE_LOCAL 及所有本地性比 NODE_LOCAL 查的,也就是该集合包括 NODE_LOCAL, NO_PREF, RACK_LOCAL, ANY
  • 以此类推,可用本地性集合包含 taskSet 中的 tasks 所拥有的最佳本地性及所有比该本地性差的本地性

这个可用本地性集合会在后面的将 task 分配给 executor 起关键作用

结合 taskSets 的排序及本地性集合将 tasks 分配给 executors

这一步的实现代码如下:

for (taskSet <- sortedTaskSets; maxLocality <- taskSet.myLocalityLevels) {
  do {
    launchedTask = resourceOfferSingleTaskSet(
        taskSet, maxLocality, shuffledOffers, availableCpus, tasks)
  } while (launchedTask)
}

含义是根据 sortedTaskSets 的顺序依次遍历其每一个 taskSetManager,
从该 taskSetManager 的本地性从高到低依次调用 TaskSchedulerImpl#resourceOfferSingleTaskSet,流程如下图:


以上,就完成了分配 tasks 给 executors 的流程分析,细节比较多,涉及的知识点也比较多,需要扩展阅读文中给出的另几个文章,最后给出一个整体的流程图方便理解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容